/**
 * Created by Administrator on 2017/11/9 0009.
 */
!function ($) {
    // 用户表配置
    var TableInit = function () {
        var oTableInit = new Object();
        oTableInit.context = {};
        oTableInit.cache = {};
        oTableInit.extensions = {};
        //初始化Table
        oTableInit.init = function () {
            $(oTableInit.context.table).bootstrapTable({
                url: oTableInit.context.config.url,         //请求后台的URL（*）
                method: oTableInit.context.config.method,                      //请求方式（*）
                contentType: oTableInit.context.config.contentType,
                ajaxOptions: oTableInit.context.config.ajaxOptions,
                toolbar: oTableInit.context.config.toolbar,                //工具按钮用哪个容器
                cache: oTableInit.context.config.cache,                       //是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）
                pagination: oTableInit.context.config.pagination,                   //是否显示分页（*）
                sortable: oTableInit.context.config.sortable,                     //是否启用排序
                sortOrder: oTableInit.context.config.sortOrder,                   //排序方式
                queryParams: oTableInit.context.config.queryParams,//传递参数（*）
                sidePagination: oTableInit.context.config.sidePagination,           //分页方式：client客户端分页，server服务端分页（*）
                pageNumber:oTableInit.context.config.pageNumber,                       //初始化加载第一页，默认第一页
                pageSize: oTableInit.context.config.pageSize,                       //每页的记录行数（*）
                pageList: oTableInit.context.config.pageList,        //可供选择的每页的行数（*）
                strictSearch: oTableInit.context.config.strictSearch,
                paginationLoop: oTableInit.context.config.paginationLoop,
                responseHandler: oTableInit.context.config.responseHandler,
                search: oTableInit.context.config.search,
                uniqueId: oTableInit.context.config.uniqueId,
                undefinedText: oTableInit.context.config.undefinedText,
                columns: oTableInit.context.config.columns
            });
        };
        
        oTableInit.initConfig = function (table, opts) {

            oTableInit.context.table = table;
            var config = opts.config || {};
            oTableInit.context.config = {
                url: config.url || '',         //请求后台的URL（*）
                method: config.method || 'post',                      //请求方式（*）
                ajaxOptions: config.ajaxOptions || {},
                responseHandler: config.responseHandler || function (res) {
                    return res;
                },
                contentType: config.contentType || "application/x-www-form-urlencoded",
                toolbar: config.toolbar || false,                //工具按钮用哪个容器
                cache: config.cache == undefined ? true : config.cache,                       //是否使用缓存，默认为true，所以一般情况下需要设置一下这个属性（*）
                pagination: config.pagination == undefined ? true : config.pagination,                   //是否显示分页（*）
                sortable: config.sortable == undefined ? true : config.sortable,                     //是否启用排序
                sortOrder: config.sortOrder || "asc",                   //排序方式
                queryParams: oTableInit.getQueryParams,//传递参数（*）
                sidePagination: config.sidePagination || "client",           //分页方式：client客户端分页，server服务端分页（*）
                pageNumber:config.pageNumber || 1,                       //初始化加载第一页，默认第一页
                pageSize: config.pageSize || 25,                       //每页的记录行数（*）
                pageList: config.pageList || [10, 25, 50, 100, 'All'],        //可供选择的每页的行数（*）
                strictSearch: config.strictSearch == undefined ? true : config.strictSearch,
                paginationLoop: config.paginationLoop == undefined ? true : config.paginationLoop,
                search: config.search || false,
                uniqueId: config.uniqueId || 'index',
                undefinedText: config.undefinedText || '-',
                columns: config.columns || []
            };
            oTableInit.context.getQueryParam = opts.getQueryParam || function () {
                return {};
            };

            // 扩展功能：表单页排序功能
            if(config.singlepageSortDict){
                // 开通表单页排序功能，开通之后会屏蔽表默认的排序功能
                oTableInit.extensions.singlepageSortDict = {};
                $.each(config.columns, function (index, column) {
                    oTableInit.extensions.singlepageSortDict[column.field] = column.sorter;
                });
                $(table).find('th .sortable').on('click', function () {
                    var th_inner = $(this);
                    if(th_inner.hasClass('sortable')){
                        $(this).parent().siblings().find('.sortable').removeClass('asc').removeClass('desc');
                        var field = $(this).parent().data('field');
                        var order;
                        // 可以进行排序
                        if(th_inner.hasClass('asc')){
                            th_inner.removeClass('asc').addClass('desc');
                            order = 1;
                        }else{
                            th_inner.removeClass('desc').addClass('asc');
                            order = 0;
                        }
                        var data = oTableInit.func('getData');
                        var extend_data = $.extend(true, [], data);
                        var sorter = oTableInit.extensions.singlepageSortDict[field];
                        data = sort(extend_data, sorter, order, field);
                        var tbody = $(table).find('tbody');
                        var new_trs = [];
                        var tr;
                        $.each(data, function (index, model) {
                            tr = tbody.find('tr[data-uniqueId='+model['id']+']');
                            new_trs.push(tr);
                        });
                        tbody.html(new_trs);
                    }
                    return false;
                });

                var sort = function (data, sortFunc, order, field) {
                    // 使用冒泡排序，建议使用快排
                    var temp, compare, compare_flag;
                    var defaultCompare = function (a, b, sortName, order) {
                        var a_field = a[sortName] == undefined?'':a[sortName];
                        var b_field = b[sortName] == undefined?'':b[sortName];
                        if(a_field < b_field){
                            return 1;
                        }else{
                            return 0;
                        }
                    }
                    compare = sortFunc || defaultCompare;
                    for(var i = 0, len = data.length; i < len; i++){
                        for(var j = 0, j_len = len-i; j < j_len; j++){
                            if((j_len - j) != 1){
                                compare_flag = compare(data[j], data[j+1], field, order);
                                compare_flag = !!order?compare_flag:!compare_flag;
                                if(compare_flag){
                                    temp = data[j+1];
                                    data[j+1] = data[j];
                                    data[j] = temp;
                                }
                            }
                        }
                    }
                    return data;
                };
            }

        }

        // 刷新函数
        oTableInit.refresh = function(params){
            if(!!params){
                oTableInit.func('refresh', params);
            }else{
                oTableInit.func('refresh');
            }

        };
        
        // 调用默认的方法
        oTableInit.func = function (func_name, options) {
            var result = oTableInit.context.table.bootstrapTable(func_name, options);
            return result;
        }

        //得到查询的参数
        oTableInit.getQueryParams = function (params) {
            var param = oTableInit.context.getQueryParam() || {};
            if(oTableInit.context.config.sidePagination == 'server'){
                var table_param = oTableInit.func('getOptions');
                params = params?{
                    page: params.offset && params.offset/params.limit,
                    size: params.limit
                }:{
                    page: table_param.pageNumber-1,
                    size: table_param.pageSize
                }
                $.extend(param, params);
            }
            return param;
        };
        return oTableInit;
    };

    // 配置到jquery的方法域中
    $.fn.extend({
        "BTableModule": function (opts) {
            console.info('表格初始化');
            opts = opts || {};
            var table = this;
            var oTable = TableInit();
            oTable.initConfig(table, opts);
            oTable.init();
            return oTable;
        }
    });
}(jQuery);